/**
 * 给定一行N个格子，第i个格子有Ai，表示可以从i开始向左涂Ai个格子
 * 或者从i开始向右头涂Ai个格子
 * 问涂满最少要涂几次。
 * 
 * 典型的想法是Dise表示到第i格涂满[s,e]区间所用的最少次数
 * 但是这个不方便直接转移，因为无法确定i之前的格子是向左涂还是向右涂。
 * 
 * 标程的解法，令Dise是到第i格左边最近的空格为s，右边最近的空格为e的最小次数
 * 注意这与涂满[s+1,e-1]并不等价，因为其他地方有可能涂色
 * 转移方程没看懂，这是O(N^3)
 * 
 * 令Dij表示到第i格向右涂满到j的最少次数(注意此时保证有j>=i)
 * 对第i格而言只有三种做法，不涂、左、右
 * 
 * 如果向右涂，则之能改变D[i][R], 其中 R = min(N, i + A[i] - 1)
 * D[i][R] = min(D[i-1][j] + 1, j在[i-1,R]之间)
 * 
 * 如果向左涂，首先可以改变Dii，Dii = min(D[i-1][j], j在[L-1, i]之间)
 * 其中 L = max(1, i - A[i] + 1)
 * 
 * 其次向左涂还有可能改变i以后的格子, 对于每一个[i-1:L-1:-1]之间的j：
 * 令rx是当前j能够伸到的最右位置，D[i][rx] = min(D[i][rx],  D[i - 1][j - 1] + 2)
 * D[i-1][j-1]表示到i-1为止涂满j-1所需的最少次数，然后第j格往右涂，第i格往左涂，恰好可以填满到rx格
 * 注意D[i-1][j-1]的构成可能不包括第j格往左，因为第j格往左只会影响j及其以后的格子
 * 所以这个方程是对的
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;

template<typename T>
void input(vector<T> & v, int n){
	v.assign(n + 1, 0);
	for(int i=1;i<=n;++i) cin >> v[i];
	return;
}

void chkmin(int & d, int a){
	if(-1 == a) return;
	if(-1 == d or a < d) d = a;
}

int N;
vi A;
vector<vi> D;

int proc(){
    D.clear();
	D.reserve(N + 1);
	D.emplace_back(vi(N + 1, 0x3F4F5F6F));
	D[0][0] = 0;

	for(int i=1;i<=N;++i){
		D.emplace_back(D.back());

		int llimit = max(1, i - A[i] + 1);
		int rlimit = min(N, i + A[i] - 1);

		for(int j=llimit-1;j<=i;++j){
			chkmin(D[i][i], D[i - 1][j] + 1);
		}

		for(int j=i-1;j<=rlimit;++j){
			chkmin(D[i][rlimit], D[i - 1][j] + 1);
		}

        int rx = 0;
		for(int j=i-1;j>=llimit;--j){
            rx = max(rx, j + A[j] - 1);
			rx = min(rx, N);
			if(rx >= i){
				chkmin(D[i][rx], D[i - 1][j - 1] + 2);
			}
		}
	}

#ifndef ONLINE_JUDGE
    for(int i=1;i<=N;++i){
		cout << i << ":";
		for(int j=1;j<=N;++j){
            cout << " " << D[i][j]; 
		}
		cout << endl;
	}
#endif

	return D[N][N];
}

void work(){
    cin >> N;
	input(A, N);
	cout << proc() << "\n";
	return;
}



int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int nofkase = 1;
    cin >> nofkase;
    while(nofkase--) {
		work();
	}
    return 0;
}